// 二分法
package week03

import (
	"fmt"
	"math"
	"sort"
)

/*
功能: 程序停止时输出low和high位置

	@param list []int  有序列表
	@param x    int    搜索的目标对象
	@return [int]      算法结束时low, high的值
*/
func Question1(list []int, x int) (int, int) {

	sort.Ints(list) // 约定 有序列表, 元素从小到大

	low, high := 0, len(list)-1
	for {
		if low > high {
			break
		}
		mid := low + (high-low)/2
		if x == list[mid] {
			fmt.Println(mid)
			return low, high
		}
		if x < list[mid] {
			high = mid - 1
		} else {
			low = mid + 1
		}
	}

	fmt.Printf("not found, current low=%d, high=%d\n", low, high)
	return low, high
}

/*
功能: 带重复元素的有序列表, 查找的是重复元素时定位到第一个

	@param list []int  含有重复元素的有序列表
	@param x    int    搜索的目标对象
	@return [int]      算法结束时low值
*/
func Question2(list []int, x int) int {

	low, high := 0, len(list)-1
	for {
		if low >= high {
			break
		}
		mid := low + (high-low)/2
		if x <= list[mid] {
			high = mid
		} else {
			low = mid + 1
		}
	}

	fmt.Println("low=", low)
	return low
}

// 功能: 判断f(x)-g(x)正负
//
//	@return [bool]  结果为负时false, 为正时true
func Question4(x float64) bool {
	fx := math.Log2(x)
	gx := x*x - 3*x

	fmt.Printf("f(x)=Log2(%f)=%f\n", x, fx)
	return fx-gx >= 0
}
